#include "BlockQueue.hpp"
#include <pthread.h>
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <unistd.h>
#include "Task.hpp"

// 消费者和生产者使用同一个阻塞队列
void *consumer(void *args)
{
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
    while (true)
    {
        // sleep(1);
        Task t = bq->Pop();
        t.Execute();

        std::cout << "消费了一个任务：" << t.X() << "+" << t.Y() << "=" << t.Result() << std::endl;
    }
}
void *productor(void *args)
{
    int x = 1;
    int y = 1;
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
    while (true)
    {
        // sleep(1);
        std::cout << "生产了一个任务：" << x << "+" << y << "=?" << std::endl;
        Task t(x, y);
        bq->Equeue(t);

        x++;
        y++;
    }
}

int main()
{
    // 申请阻塞队列
    BlockQueue<int> *bq = new BlockQueue<int>();

    // 构建消费者与生产者
    pthread_t c[2], p[3];

    pthread_create(c, nullptr, consumer, bq);
    pthread_create(c + 1, nullptr, consumer, bq);
    pthread_create(p, nullptr, productor, bq);
    pthread_create(p + 1, nullptr, productor, bq);
    pthread_create(p + 2, nullptr, productor, bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);
    
    return 0;
}

